package saa.dominio.periodo.aluno;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;

import saa.dominio.periodo.OfertaDisciplina;
import saa.dominio.usuario.Aluno;

@Entity
@NamedQueries({
    @NamedQuery(name = "OfertaDisciplinaAlunos", query = "SELECT o FROM OfertaDisciplinaAluno o"),
    @NamedQuery(name = "OfertaDisciplinaAluno.aluno.id", query = "SELECT o FROM OfertaDisciplinaAluno o WHERE o.aluno.id = :id"),
@NamedQuery(name = "OfertaDisciplinaAluno.aluno.id,OfertaDisciplinaAluno.ofertaDisciplina.id", query = "SELECT o FROM OfertaDisciplinaAluno o WHERE o.aluno.id = :alunoId AND o.ofertaDisciplina.id = :ofertaId")})
public class OfertaDisciplinaAluno implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(nullable = false)
    private int nota;
    @Column(nullable = false)
    private int presencas;
    @Column(nullable = false)
    private int objetivoNota;
    @Column(nullable = false)
    private int objetivoPresencas;
    private int notaProvaFinal;

    @Column(nullable = false)
    @ManyToOne
    private OfertaDisciplina ofertaDisciplina;

    @Column(nullable = false)
    @ManyToOne
    private Aluno aluno;

    @OrderBy(value = "unidade")
    @OneToMany(fetch=FetchType.EAGER)
    private List<UnidadeDisciplinaAluno> bimestres;

    public OfertaDisciplinaAluno() {
        super();
    }

    public OfertaDisciplinaAluno(int objetivoNota, int objetivoPresencas, OfertaDisciplina ofertaDisciplina, Aluno aluno) {
        this.objetivoNota = objetivoNota;
        this.objetivoPresencas = objetivoPresencas;
        this.ofertaDisciplina = ofertaDisciplina;
        this.aluno = aluno;
        this.bimestres = new ArrayList<UnidadeDisciplinaAluno>(2);
        this.nota = 0;
        this.presencas = 0;
    }
    
    public OfertaDisciplinaAluno(OfertaDisciplina ofertaDisciplina, Aluno aluno){
        this.ofertaDisciplina = ofertaDisciplina;
        this.aluno = aluno;
        this.objetivoNota = aluno.getObjetivoNota();
        this.objetivoPresencas = (int) Math.ceil(this.ofertaDisciplina.getDisciplina().getCargaHorariaAula() * this.aluno.getObjetivoPercentualPresencas() / 100);
        this.bimestres = new ArrayList<UnidadeDisciplinaAluno>(2);
        this.nota = 0;
        this.presencas = 0;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public int getNota() {
        return nota;
    }

    public void setNota(int nota) {
        this.nota = nota;
    }

    public int getPresencas() {
        return presencas;
    }

    public void setPresencas(int presencas) {
        this.presencas = presencas;
    }

    public int getObjetivoNota() {
        return objetivoNota;
    }

    public void setObjetivoNota(int objetivoNota) {
        this.objetivoNota = objetivoNota;
    }

    public int getObjetivoPresencas() {
        return objetivoPresencas;
    }

    public void setObjetivoPresencas(int objetivoPresencas) {
        this.objetivoPresencas = objetivoPresencas;
    }

    public int getNotaProvaFinal() {
        return notaProvaFinal;
    }

    public void setNotaProvaFinal(int notaProvaFinal) {
        this.notaProvaFinal = notaProvaFinal;
    }

    public OfertaDisciplina getOfertaDisciplina() {
        return ofertaDisciplina;
    }

    public void setOfertaDisciplina(OfertaDisciplina ofertaDisciplina) {
        this.ofertaDisciplina = ofertaDisciplina;
    }

    public Aluno getAluno() {
        return aluno;
    }

    public void setAluno(Aluno aluno) {
        this.aluno = aluno;
    }

    public List<UnidadeDisciplinaAluno> getBimestres() {
        return bimestres;
    }

    public void setBimestres(List<UnidadeDisciplinaAluno> bimestres) {
        this.bimestres = bimestres;
    }
    
    public void addBimestre(UnidadeDisciplinaAluno bimestre) {
        this.bimestres.add(bimestre);
    }
}
